package ufpr.ees.suhck.model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Future;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@NamedQueries({
    @NamedQuery(name = Agendamento.FIND_POR_SITUACAO, query = "SELECT a FROM Agendamento a "
            + "WHERE a.situacao = :situacao"),
    @NamedQuery(name = Agendamento.FIND_POR_PACIENTE, query = "SELECT a FROM Agendamento a "
            + "WHERE a.paciente.id = :paciente"),
    @NamedQuery(name = Agendamento.FIND_POR_DATA, query = "SELECT a FROM Agendamento a "
            + "WHERE a.dataAgendamento >= :datainicial and a.dataAgendamento <= :datafinal")
})
public class Agendamento implements Serializable {

    public static final String FIND_POR_SITUACAO = "Agendamento.findPorSituacao";
    public static final String FIND_POR_PACIENTE = "Agendamento.findPorPaciente";
    public static final String FIND_POR_DATA = "Agendamento.findPorData";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false)
    private Paciente paciente;

    @ManyToOne(optional = false)
    private Atendente atendente;

    @OneToOne(optional = true)
    private Atendimento atendimento;

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(name = "estado_paciente", nullable = false)
    private EstadoPaciente estadoPaciente = EstadoPaciente.ESTAVEL;

    @Enumerated(EnumType.STRING)
    @Column(name = "situacao_atendimento")
    private SituacaoAtendimento situacao = SituacaoAtendimento.ESPERA;

    @Size(max = 1023, message = "Diagnóstico deve ter no máximo {max} caracteres.")
    @Column(length = 1023)
    private String anamnese; //texto com os sintomas do paciente

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_agendamento")
    private Date dataAgendamento;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Paciente getPaciente() {
        return paciente;
    }

    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }

    public Atendente getAtendente() {
        return atendente;
    }

    public void setAtendente(Atendente atendente) {
        this.atendente = atendente;
    }

    public EstadoPaciente getEstadoPaciente() {
        return estadoPaciente;
    }

    public void setEstadoPaciente(EstadoPaciente estadoPaciente) {
        this.estadoPaciente = estadoPaciente;
    }

    public SituacaoAtendimento getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoAtendimento situacao) {
        this.situacao = situacao;
    }

    public String getAnamnese() {
        return anamnese;
    }

    public void setAnamnese(String anamnese) {
        this.anamnese = anamnese;
    }

    public Date getDataAgendamento() {
        return dataAgendamento;
    }

    public void setDataAgendamento(Date dataAgendamento) {
        this.dataAgendamento = dataAgendamento;
    }

    public Atendimento getAtendimento() {
        return atendimento;
    }

    public void setAtendimento(Atendimento atendimento) {
        this.atendimento = atendimento;
    }

    public Agendamento clone() {
        Agendamento ag = new Agendamento();
        ag.setId(this.getId());
        ag.setAnamnese(this.getAnamnese());
        ag.setAtendente(this.getAtendente());
        ag.setAtendimento(this.getAtendimento());
        ag.setDataAgendamento(this.getDataAgendamento());
        ag.setEstadoPaciente(this.getEstadoPaciente());
        ag.setPaciente(this.getPaciente());
        ag.setSituacao(this.getSituacao());
        return ag;
    }
}
